package com.yizhang.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.util.matcher.OrRequestMatcher;

/**
 * @Author: yi.zhang
 * @CreateTime: 2025-06-13 11:30:09
 * @Description: 自定义认证规则
 */
@Configuration
public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .mvcMatchers("/hello").permitAll()  //放行url
                .mvcMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")  //指定登录页 这里采用接口跳转的方式
                .loginProcessingUrl("/doLogin") //指定表单提交的 URL（如 /doLogin） 若未显式配置 loginProcessingUrl()，其值默认与 loginPage() 相同
//                .successForwardUrl("/hello") //请求转发 成功后总是会转发到这个路径下
//                .defaultSuccessUrl("/hello", false) //重定向  如果之前有过url请求，就跳转到该url 否则跳转到这个默认路径下
                .successHandler(new MyAuthenticationSuccessHandler()) //返回登录信息 前后端分离使用
//                .failureForwardUrl("/login") //失败请求转发
//                .failureUrl("/login")  //失败重定向
                .failureHandler(new MyAuthenticationFailureHandler()) //返回登录失败信息 前后端分离使用
                .and()
                .logout()
//                .logoutUrl("/logout") //默认注销路径
                .logoutRequestMatcher(new OrRequestMatcher(  //自定义注销路径
                        new AntPathRequestMatcher("/aa", "GET"),
                        new AntPathRequestMatcher("/bb", "POST")
                ))
                .clearAuthentication(true)
                .invalidateHttpSession(true)
//                .logoutSuccessUrl("/login")
                .logoutSuccessHandler(new MyLogoutSuccessHandler())  //返回注销成功信息 前后端分离使用
                .and()
                .csrf().disable();
    }
}
